
#pragma once
#include <ctime>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <iostream>


using namespace std;

/*  实用工具类实现 ：
    1、 获取系统时间
    2、 判断文件是否存在
    3、 获得文件所在路径
    4、 创建目录
*/
namespace CH
{
	namespace Util
	{
		class date
		{
		public:
			//返回现在的时间，设置为静态函数，不用实例化，也可以调用函数
			static time_t now(){return (size_t)time(nullptr);}
		};
		
		class file
		{
		public:
		    //判断文件是否存在
			static bool is_file_exit(const string& name)
			{
				//存储文件的属性
				struct stat st;
				//将该文件的属性，存储在st中，如果存储成功，则返回0，即代表文件存在
				//如果存储失败，则返回-0，即代表文件不存在
				return stat(name.c_str(),&st)==0;
			}
			//返回文件的目录
			static string file_path(const string& name)
			{
				//为空，则表示该路径下没有文件
				if(name.empty()) return ".";
				int pos=name.rfind("/");//从最后开始找
				if(pos==string::npos) return ".";
				return name.substr(0,pos+1);//返回路径，不包括最后一个文件
			}

			// 创建指定文件夹，如果文件夹已经存在，则不需要创建，不存在就要创建
			static void create_directory(const string& path)
			{
				//如果为空或文件不存在，则直接返回
				if(path.empty()) return;
				if(is_file_exit(path)) return;

				size_t pos=0,idx=0;
				while(idx<path.size())
				{
					//./path/
					pos=path.find("/",idx);
					if(pos==string::npos)
					{
						//如果为".","/",则表示文件夹已经存在，即创建时会创建失败，返回
						//如果为".abc","adc",则会在该路径下创建abc文件夹
						mkdir(path.c_str(),0777);
						return;
					}

					// ./abc/a/c
					string str=path.substr(0,pos+1);
					if(!is_file_exit(str))
					{
						mkdir(str.c_str(),0777);
					}
					idx=pos+1;
				}
			}

		};

	}
}
